package org.opens.javaskill.design;

public class TemplatePattern {

    public static void main(String[] args) {
        Game contra = new Contra();
        Game football = new Football();

        contra.play();
        football.play();
    }

}

/**
 * 功能:
 * <p>模板模式的抽象父类.</p>
 */
abstract class Game {

    public abstract void init();

    public abstract void start();

    public abstract void end();

    /**
     * 说明:
     * <pre>
     *     1. 被final修饰的方法不会被子类重写.
     *     2. 这个方法规定了如何调用init, start, end这三个方法.
     * </pre>
     */
    public final void play() {
        init();
        start();
        end();
    }

}

/**
 * 说明:
 * <pre>
 *     1. 这个是魂斗罗游戏的实现;
 * </pre>
 */
class Contra extends Game {

    @Override
    public void init() {
        System.out.println("魂斗罗初始化完成");
    }

    @Override
    public void start() {
        System.out.println("魂斗罗玩中");
    }

    @Override
    public void end() {
        System.out.println("魂斗罗结束");
    }

}

/**
 * 说明:
 * <pre>
 *     1. 这个是足球游戏的实现;
 * </pre>
 */
class Football extends Game {

    @Override
    public void init() {
        System.out.println("足球初始化完成");
    }

    @Override
    public void start() {
        System.out.println("足球玩中");
    }

    @Override
    public void end() {
        System.out.println("足球结束");
    }

}